# mcp_server.py
"""
统一的 FastMCP Server 模板
支持：
- 自动加载 tools 目录下的所有函数工具
- 自动捕获异常并返回标准 MCP error (通过 @safe_tool 实现)
- 自动生成文档 (FastAPI / OpenAPI)
- 可运行 HTTP 或 STDIO 模式
"""

import importlib
import pkgutil
from fastmcp import FastMCP
from pydantic import BaseModel

# 实例化 MCP 服务
mcp = FastMCP("IndustrialMCPServer")


# ======== 工具加载器 =========
def register_tools_from_package(package_name: str):
    """从指定包（如 tools）动态加载所有标记为 MCP 工具的函数"""
    try:
        package = importlib.import_module(package_name)
    except ImportError:
        print(f"⚠️ 警告: 工具包 '{package_name}' 不存在或无法导入，跳过加载。")
        return

    for _, mod_name, _ in pkgutil.iter_modules(package.__path__):
        try:
            module = importlib.import_module(f"{package_name}.{mod_name}")
            for name, obj in module.__dict__.items():
                # 检查对象是否是被 @safe_tool 装饰过的函数
                if callable(obj) and getattr(obj, "_is_mcp_tool", False):
                    # 注册函数
                    print(f"🔧 注册工具: {obj.__name__} 来自 {module.__name__}")
                    mcp.tool(obj)
        except Exception as e:
            print(f"❌ 加载模块 '{mod_name}' 或注册工具时出错: {e}")


# ======== 动态加载所有工具 =========
register_tools_from_package("tools")

# ======== 启动 MCP 服务 =========
if __name__ == "__main__":
    import time

    while True:
        try:
            # 模式可选："http" 或 "stdio"
            mcp.run(transport="http", host="127.0.0.1", port=9000)
        except KeyboardInterrupt:
            print("⏹ 退出 MCP Server。")
            break
        except Exception as e:
            print(f"⚠️ 运行时错误: {e}")
            time.sleep(2)